今天將以深度學習常見的手寫阿拉伯數字辨識的資料集訓練,keras提供了兩種類型的模型,第一個是Sequential model,適用於簡單的結構,一層一層的連接下去。第二個為Functional API,它可以設計成複雜的神經網路,包含多個輸入以及輸出。
首先,先寫一個function用來畫accuracy以及loss的圖。
import matplotlib.pyplot as plt
def plot(model, attr, width, height):
plt.figure(figsize=(width, height))
plt.plot(model.history[attr], color = 'r', label = attr)
plt.plot(model.history['val_'+attr], color = 'b', label = 'val_'+attr)
plt.xlabel('Epochs')
plt.ylabel(attr)
plt.legend()
plt.show()
這個模型為使用Seuquential model,從keras的套件裡匯入資料集。
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
接著,將資料正規化,原始資料介於0-255之間,將它的範圍縮小至0-1之間,加速模型運算時間。
x_train, x_test = x_train/255.0, x_test/255.0
接著訓練模型,第一層使用Flatten,ru; 28乘28的資料攤平變成一維,轉乘784個特徵值。
Dense層為全連接層 (Fully connected),輸入為上一層的輸出,輸出為128個神經元。
Dropout的比例設為0.2,代表將20%的神經元之權重設為0,避免過度擬合的情況發生。
最後一層一樣為全連接層,神經元為10,因為手寫阿拉伯數字為0-9,總共有10個,而激活函數為softmax,在10個機率裡,最高的那個類別集為預測值。
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape = (28, 28)),
tf.keras.layers.Dense(128, activation = 'relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation = 'softmax')
])
最後,設置模型的優化器以及loss function,以及評比的指標,並且輸入資料以及檢視準確率。
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics = ['accuracy'])
history = model.fit(x_train, y_train, epochs = 5, validation_split = 0.2)
model.evaluate(x_test, y_test)
最後一行輸出的第一個值為loss,第二個值為accuracy,這個模型的準確率高達97%。
f1 = plot(history, 'accuracy', 5, 3)
f2 = plot(history, 'loss', 5, 3)
這個模型只訓練了5次即能達到優異的預測效果,accuracy與loss最後測試集與驗證集的差距不大,沒有overfitting的問題。
Funtional API的程式碼前處理與sequential的一樣,不同的地方在於寫每一層的語法。
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train/255.0, x_test/255.0
Input = tf.keras.layers.Input(shape=(28,28))
layer1 = tf.keras.layers.Flatten()(Input)
layer2 = tf.keras.layers.Dense(128, activation = 'relu')(layer1)
layer3 = tf.keras.layers.Dropout(0.2)(layer2)
Output = tf.keras.layers.Dense(10, activation = 'softmax')(layer3)
model2 = tf.keras.Model(inputs = Input, outputs = Output)
model2.summary()
model2.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics = ['accuracy'])
history2 = model2.fit(x_train, y_train, epochs = 5, validation_split = 0.2)
model2.evaluate(x_test, y_test)
使用Funtinal API的預測效果準確率也高達97%。
plot(history2, 'accuracy', 5, 3)
plot(history2, 'loss', 5, 3)
accuracy與loss跟上個模型一樣,在最後一個epoch的時候幾乎一樣。
程式碼已上傳我的Github
感謝您的瀏覽!